package com.zhj.agent.support;

import java.lang.reflect.Method;

/**
 * 环绕方法执行的接口
 */
public interface InstanceMethodsAroundInterceptor {

    /**
     * Before method
     *
     * @param objInst        增强的对象
     * @param method         增强的方法
     * @param allArguments   获取的所有的参数
     * @param argumentsTypes 所有参数的类型
     * @throws Throwable throwable
     * @since 1.0.0
     */
    void beforeMethod(Object objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes) throws Throwable;

    /**
     * After method
     *
     * @param objInst        obj inst
     * @param method         method
     * @param allArguments   all arguments
     * @param argumentsTypes arguments types
     * @param result         方法执行完的结果
     * @return the object
     * @throws Throwable throwable
     * @since 1.0.0
     */
    Object afterMethod(Object objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, Object result) throws Throwable;

    /**
     * 方法异常的处理
     *
     * @param objInst        obj inst
     * @param method         method
     * @param allArguments   all arguments
     * @param argumentsTypes arguments types
     * @param t              抛出的异常信息
     * @since 1.0.0
     */
    void handleMethodException(Object objInst, Method method, Object[] allArguments,
                               Class<?>[] argumentsTypes, Throwable t);
}
